<?php
class Rating extends Service_Pager {

	private $arrRating = array();
	private $arrFolders = array();
	private $arrFoldersIds = array();
	private $arrTemp = array();
	/*
	!!!ДЛЯ ДОБАВЛЕНИЯ НОВОЙ СУЩНОСТИ!!!
	1) записать сюда
	2) добавить массив со значениями в bitbybit_rating.php(в корне)
	3) добавить case в self::getRateValues, getNameRate
	4) создать новую запись в таблице файла pages/admin/editRating.php
	5) обработать POST запрос в formSubmit/editRating.php
	6) вставить в нужное место

	0 - регистрация +!
	1 - !+!добавление статьи +!
	2 - добавление вопроса +!
	3 - добавление ответа +!
	4 - добавление лучший ответ +?
	5 - !+!добавление урока +!
	6 - !+!добавление готового решения +?
	7 - !+!добавление комментария +!
	8 - добавление нового раздела  +!
	9 - добавление бага +!
	10 - добавление (выставление) оценки +!
	11 - добавление оценки сложности +!
	12 - получение оценки(стоимость не нужна) +!
	13 - !+!добавление раздела в любимые +!
	14 - пустое поле +!
	15 - выставление +/- +!
	16 - получение раейтинга по +/- (стоимость не нужна) +!
	!17 - добавление заявки на контент
	!18 - выполнение завки на контент
	!19 - невыполнение заявки на контент

	98 - добавление посещение за день +!
	99 - просмотр страницы +!
	*/

	/**
	 * получаем значение по номеру
	 */
	static function getRateValues($rateNum){
		require(ABSPATH . '../prprof_rating.php');
		switch ($rateNum){
			case 0: return $registration; break;
			case 1: return $addAricle; break;
			case 2: return $addquestion; break;
			case 3: return $addAnswer; break;
			case 4: return $authorBestAnswer; break;
			case 5: return $addLesson; break;
			case 6: return $addSolution; break;
			case 7: return $addComment; break;
			case 8: return $addFolder; break;
			case 9: return $addBug; break;
			case 10: return $addMark; break;
			case 11: return $addComplexity; break;
			case 13: return $addLike; break;
			case 14: return $empty; break;
			case 16: return $poll; break;
			case 17: return $addContentRequest; break;
			case 18: return $realizationContentRequest; break;
			case 19: return $failedContentRequest; break;
			case 98: return $dayVisit; break;
			case 99: return $viewing; break;
		}
	}

	/**
	 * получаем значение по номеру
	 */
	static function getNameRate($rateNum){
		switch ($rateNum){
			case 0: return '$registration'; break;
			case 1: return '$addAricle'; break;
			case 2: return '$addquestion'; break;
			case 3: return '$addAnswer'; break;
			case 4: return '$authorBestAnswer'; break;
			case 5: return '$addLesson'; break;
			case 6: return '$addSolution'; break;
			case 7: return '$addComment'; break;
			case 8: return '$addFolder'; break;
			case 9: return '$addBug'; break;
			case 10: return '$addMark'; break;
			case 11: return '$addComplexity'; break;
			case 13: return '$addLike'; break;
			case 14: return '$empty'; break;
			case 16: return '$poll'; break;
			case 17: return '$addContentRequest'; break;
			case 18: return '$realizationContentReques'; break;
			case 19: return '$failedContentRequest'; break;
			case 98: return '$dayVisit'; break;
			case 99: return '$viewing'; break;
		}
	}

	/**
	 * получаем описание по номеру
	 */
	static function getUserNameRate($rateNum){
		switch ($rateNum){
			case 0: return 'Регистрация'; break;
			case 1: return 'Добавление статьи'; break;
			case 2: return 'Добавление вопроса'; break;
			case 3: return 'Добавление ответа'; break;
			case 4: return 'Добавление лучшего ответа'; break;
			case 5: return 'Добавление урока'; break;
			case 6: return 'Добавление готового решения'; break;
			case 7: return 'Добавление комментария'; break;
			case 8: return 'Добавление нового раздела'; break;
			case 9: return 'Добавление бага'; break;
			case 10: return 'Добавление (выставление) оценки'; break;
			case 11: return 'Добавление (выставление) оценки сложности'; break;
			case 12: return 'Получение оценки'; break;
			case 13: return 'Добавление раздела в любимые'; break;
			case 15: return 'Выставление +/-'; break;
			case 16: return 'получение раейтинга по +/-'; break;
			case 17: return 'добавление заявки на контент'; break;
			case 18: return 'выполнение заявки на контент'; break;
			case 19: return 'невыполнение заявки на контент'; break;
			case 98: return 'Добавление посещение за день'; break;
			case 99: return 'Просмотр страницы'; break;
			default: return '!!!!!Неизвестное значение';
		}
	}

	/**
	 * добавлет рейтинг
	 */
	public static function addRating($idEssence, $essenceType, $idUser, $rateNum){
		$arrRate = self::getRateValues($rateNum);
/*		if ($rateNum != 0 AND $rateNum != 9 AND $rateNum != 10 AND $rateNum != 11 AND $rateNum != 98)
			$essenceDayCount = self::getEssenceDateCount($essenceType, $idUser);//получаем количесво добавленных сущностей за день
		else $essenceDayCount = 0;
		$arrRate = self::calculationRating($arrRate, $essenceDayCount);//делаем поправку на количесво добавленных сущностей за день
*/
		self::addRatingToUserTable($idUser, $arrRate);//добавляем рейтинг пользователю
		self::addRatingToLogTable($idEssence, $essenceType, $idUser, $rateNum, $arrRate);//сохранияем в лог
		return true;
	}

	/**
	 * уменьшаем рейтинг
	 */
	public static function deleteRating($idEssence, $essenceType, $idUser, $rateNum, $folder = NULL){
		$arrRate = self::getRateValues($rateNum);
		self::addRatingToUserTable($idUser, $arrRate, false, true);//уменьшаем рейтинг пользователю
		self::addRatingToLogTable($idEssence, $essenceType, $idUser, $rateNum, $arrRate);//сохранияем в лог
		return true;
	}

	/**
	 * вставляем рейтинг при выставлении оценки сущности
	 */
	public static function addRatingByMarkSet($idEssence, $essenceType, $mark, $folder = NULL){
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$idEssenceCreator = User_User::getUserIdByEssence($idEssence, $essenceType);//получаем id создателя сущности
		$rate = self::calculationtRatingByMark($mark, $idUser);//считаем сколько рейтинга нужно добавляеть создателю сущности

		self::addRatingAndMoneyToLogTable($idEssence, $essenceType, $idEssenceCreator, 12, $rate, true);//сохранияем в лог рейтинг добавленный создателю сущности
		self::addRatingAndMoneyToUserTable($idEssenceCreator, $rate, true);//добавляем рейтинг создателю сущности
		if ((int)$folder){
			if ($essenceType == 5 OR $essenceType == 6){//если вопрос или ответ, и добавлен в невидимый раздел, то нужно использовать рутовый раздел
				$folderInfo = TreeStructure::getFolderInfo($folder);
				if ($folderInfo['show_folder'] == 0)
					$folder = $folderInfo['ID_root_folder'];
			}
			self::addRatingToFolder($idEssenceCreator, $folder, $rate);//добавляем рейтинг создателю сущности в папку
		}
		self::addRating($idEssence, $essenceType, $idUser, 10);
		return true;
	}

	/**
	 * вставляем рейтинг при выставлении оценки +/- сущности
	 */
	public static function addRatingByPollSet($idEssence, $essenceType, $mark, $folder = NULL){
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$idEssenceCreator = User_User::getUserIdByEssence($idEssence, $essenceType);//получаем id создателя сущности
		if ($idEssenceCreator) {
			$rate = self::calculationtRatingByPoll($mark, $idUser);//считаем сколько рейтинга нужно добавляеть создателю сущности

			self::addRatingToLogTable($idEssence, $essenceType, $idEssenceCreator, 15, $rate, true);//сохранияем в лог рейтинг добавленный создателю сущности
			self::addRatingToUserTable($idEssenceCreator, $rate, true);//добавляем рейтинг создателю сущности
/*			if (is_int($folder))
				self::addRatingToFolder($idEssenceCreator, $folder, $rate);//добавляем рейтинг создателю сущности в папку*/
			self::addRating($idEssence, $essenceType, $idUser, 16);
			return true;
		}
		else return false;
	}

	/**
	 * вставка древовидного рейтинга
	 */
	static function addRatingToFolder($idUser, $idFolder, $value, $deleteRatinfFlag = false){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT COUNT(`folder_rating`.`ID_folder_rate`)
		FROM `folder_rating`
		WHERE `folder_rating`.`ID_user` = " . $idUser . " AND `folder_rating`.`ID_folder` = " . $idFolder;
		if ($objDB->selectSimpleField($stmt) == 0){
			$stmt = "
			INSERT INTO `folder_rating` (`ID_user`, `ID_folder`, `rating`)
			VALUES (" . $idUser . ", " . $idFolder . ", " . ($deleteRatinfFlag ? (0-$value) : $value) . ")";
			$objDB->query($stmt);
		}
		else {
			$stmt = "
			UPDATE `folder_rating`
			SET `folder_rating`.`rating` = (`folder_rating`.`rating` " . ($deleteRatinfFlag ? '-' : '+') . "  " . $value . ")
			WHERE `folder_rating`.`ID_user` = " . $idUser . " AND `folder_rating`.`ID_folder` = " . $idFolder;
			$objDB->query($stmt);
		}
		return true;
	}

	/**
	 * Возвращает количество добавленных сущностей за сутки(24ч.)
	 */
	static function getEssenceDateCount($essenceType, $idUser){
		$objDB = Service_Database::instance();
		$essenceName = Service_Essence::getEssenceTypeName($essenceType);
		if ($essenceName == 'tutorial_theme_offer'){
			$stmt = "
			SELECT COUNT(`offer`.`ID_offer`)
			FROM `offer`
			WHERE `offer`.`essence_type`=" . Service_Essence::getEssenceTypeID($essenceName) . "
			AND `offer`.`creation`>='" . Service_Date::gLocalTime2BD(time() - 86400) . "'";
		}
		else {
			$stmt = "
			SELECT COUNT(" . $essenceName . ".ID_" . $essenceName . ")
			FROM " . $essenceName . "
			WHERE " . $essenceName . ".`creation` >= '" . Service_Date::gLocalTime2BD(time() - 86400) . "'";
		}
		return $objDB->selectSimpleField($stmt);
	}

	/**
	 * сохраняем в табицу логов добавленные рейтинг
	 */
	static function addRatingToLogTable($idEssence, $essenceType, $idUser, $rateNum, $arrRate, $ratingOnlyFlag = false, $deleteRatinfFlag = false){
		$objDB = Service_Database::instance();
		$essenceType = Service_Essence::getEssenceTypeID($essenceType);
		if ($deleteRatinfFlag)
			$ratingOnlyFlag ? $arrRate = 0 - $arrRate : $arrRate[0] = 0 - $arrRate[0];

		if (empty($idEssence)) $idEssence = "NULL";
			$stmt = "
			INSERT INTO `".DB_PREFIX."log_rates` (`id_essence`,
															 `id_user`,
															 `essence_type`,
															 `creation`,
															 `rate_type`,
															 `rate_num`,
															 `value`)
			VALUES (" . $idEssence . ",
							" . $idUser . ",
							" . $essenceType . ",
							'" . Service_Date::gLocalTime2BD() . "',
							0,
							" . $rateNum . ",
							" . ($ratingOnlyFlag ? $arrRate : $arrRate[0]) . ")";
			$objDB->query($stmt);

		if (!$ratingOnlyFlag){
			if ($deleteRatinfFlag)
				$arrRate[1] = 0 - $arrRate[1];
			$stmt = "
			INSERT INTO `".DB_PREFIX."log_rates` (`id_essence`,
															 `id_user`,
															 `essence_type`,
															 `creation`,
															 `rate_type`,
															 `rate_num`,
															 `value`)
			VALUES (" . $idEssence . ",
							" . $idUser . ",
							" . $essenceType . ",
							'" . Service_Date::gLocalTime2BD() . "', 1,
							" . $rateNum . ",
							" . $arrRate[1] . ")";
			$objDB->query($stmt);
		}
		return true;
	}

	/**
	 * прибавляем рейтинг в таблицу user
	 */
	static function addRatingToUserTable($idUser, $arrRate, $ratingOnlyFlag = false, $deleteRatinfFlag = false){
		$objDB = Service_Database::instance();
		$stmt = "
		UPDATE `".DB_PREFIX."users` SET `".DB_PREFIX."users`.`rating` = (`".DB_PREFIX."users`.`rating` " . ($deleteRatinfFlag ? '-' : '+') . "  " . ($ratingOnlyFlag ? $arrRate : $arrRate[0]) . ")
		WHERE `".DB_PREFIX."users`.`id_user` = " . $idUser;
		return $objDB->query($stmt);
	}

	/**
	 * добавление рейтинга за просмотр страниц
	 */
	public static function addRatingForView($idUser, $essenceType, $idEssence){
		$objDB = Service_Database::instance();
		require(ABSPATH . '../bitbybit_rating.php');
		self::addRatingAndMoneyToLogTable($idEssence, $essenceType, $idUser, 99, $viewing);
		$stmt = "
		UPDATE `user` SET `user`.`rating` = (`user`.`rating` +  " . $viewing[0] . "),
											`user`.`money` = (`user`.`money` +  " . $viewing[1] . ")
		WHERE `user`.`ID_user` = " . $idUser;
		return $objDB->query($stmt);
	}

	/**
	 * сохраняем изменения параметров рейтинга в БД
	 *
	 */
	public static function saveLogRatesParameterHistory($parameters){
		$objDB = Service_Database::instance();
		$objSession = User_Session::instance();
		$idUser = $objSession->getUserId();
		$stmt = "
		INSERT INTO `log_rates_parameter_history` (`ID_user`, `creation`, `parameters`)
		VALUES (" . $idUser . ", '" . Service_Date::gLocalTime2BD() . "', '" . $parameters . "')";
		return $objDB->query($stmt);
	}

	/**
	 * пересчитываем место пользователя по ВСЕМУ сайту
	 */
	public static function recountPlace(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `rating`,
					 `ID_user`
		FROM `user`";
		$usersRating = $objDB->select($stmt);
		foreach ($usersRating as $a) {
			$usersRatingSort[$a['ID_user']] = $a['rating'];
		}
		arsort($usersRatingSort, SORT_NUMERIC);

		foreach ($usersRatingSort as $a=>$b) {
			$userPlace[] = $a;
		}
		foreach ($userPlace as $a=>$b){
			$stmt = "
			UPDATE `user` SET `rating_place` = " . ($a + 1) . "
			WHERE `user`.`ID_user` = " . $b;
			$objDB->query($stmt);
		}
	}

	/**
	 * перерасчет значений добавляемого рейтинга и денег в зависимости от количество добавленных сущностей
	 */
	static function calculationRating($arrRate, $essenceDayCount){
		if ($essenceDayCount < 12){
			$arrRate[0] = round($arrRate[0] * (1 - 0.35 * log10($essenceDayCount + 1)), 2);
			$arrRate[1] = round($arrRate[1] * (1 - 0.35 * log10($essenceDayCount + 1)), 1);
		}
		else {
			$arrRate[0] =  round($arrRate[0] * (0.7 - 0.35 * log10($essenceDayCount + 1)), 2);
			$arrRate[1] =  round($arrRate[0] * (0.7 - 0.35 * log10($essenceDayCount + 1)), 2);
		}
		return $arrRate;
	}

	/**
	 * перерасчет значений добавляемого рейтинга зависимости от рейтинга пользователя выставившего сущностей
	 */
	static function calculationtRatingByMark($mark, $idUser){
		$rating = User_User::getUserRating($idUser);
		$rating = $rating < 1 ? 1 : $rating;
		$rate = round($mark * (0.05 * (log10($rating) + 1)), 2);
		return $rate;
	}

	/**
	 * перерасчет значений добавляемого рейтинга зависимости от рейтинга пользователя выставившего сущностей
	 */
	static function calculationtRatingByPoll($mark, $idUser){
		$userRating = User_User::getUserRating($idUser);
		if ($mark == 1)
			$mark = round(0.01 * $userRating, 2);
		else
			$mark = round(-0.005 * $userRating, 1);
		return $mark;
	}

  /**
   * сортировака пользователей по рейтингу при пересчете места
   *
   */
  public static function sortRating($a, $b){
  	return strcmp($a["rating"], $b["rating"]);
  }

	/**
	 * добавляем рейтинг пользователям, кторые были сегодня на сайте
	 */
	public static function addDayRating(){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`ID_user`
		FROM `user`
		WHERE `user`.`login_time` >= '" . date("Y-m-d H:i:s", time() - 86400) . "'";
		$arrUsersId = $objDB->selectSimpleArray($stmt);
		foreach ($arrUsersId as $arrUsersId)
			self::addRating($arrUsersId, 3, $arrUsersId, 98);
		return true;
	}

	/**
	 * добавляем место пользователя в рутовые папки
	 * вызывается из treeStructure
	 */
	public static function addPlaceToRootFolder($arrRating, $arrUserRatingAndIDUser){
		//создаем массив типа array([idFolder]=>[idUser]=>[rating]) для вставки/обновления папок
		foreach ($arrRating as $a=>$b)
			foreach ($b as $c=>$d)
				$arrFolderUserRating[$a][$d['ID_user']] = $d['rating'];

		$objDB = Service_Database::instance();
		foreach ($arrRating as $a){
			foreach ($a as $b=>$c){
				//праверяем был ли рейтинг в данной папке
				$folderExist = false;
				foreach ($arrUserRatingAndIDUser[$c['ID_user']] as $arr)
					if ($arr == $c['ID_folder'])
						$folderExist = true;

				if ($folderExist)
					$stmt = "
					UPDATE `folder_rating` SET `place` = " . ($b + 1) . ", `recount_temp_rating` = " . $arrFolderUserRating[$c['ID_folder']][$c['ID_user']] . "
					WHERE `ID_user` = " . $c['ID_user'] . " AND
								`ID_folder` = " . $c['ID_folder'];
				else
					$stmt = "
					INSERT INTO `folder_rating` (`ID_user`,
																			 `ID_folder`,
																			 `rating`,
																			 `place`)
					VALUES (" . $c['ID_user'] . ",
									" . $c['ID_folder'] . ",
									NULL,
									" . ($b + 1) . ")";
				$objDB->query($stmt);
			}
		}
		return true;
	}

	/**
	 * получение статистики за неделю на страницу редактирование рейтинга
	 */
	public static function getStatTiEditPage(){
		$objDB = Service_Database::instance();
		$stmt="
		SELECT `rate_num`
		FROM `log_rates`
		GROUP BY `rate_num`";
		$arrRateNum = $objDB->selectSimpleArray($stmt);//получаем все типы рейтинга

		foreach ($arrRateNum as $arr){

			$arrAllValue[0][$arr] = 0;
			$stmt = "
			SELECT `value`
			FROM `log_rates`
			WHERE `rate_type` = 0 AND
						`creation` >= '" . Service_Date::gLocalTime2BD(time() - 604800) . "' AND
						`rate_num` = " . $arr;
			$arrValue = $objDB->selectSimpleArray($stmt);//получаем рейтинг для одного типа рейтинга

			if (isset($arrValue))
				foreach ($arrValue as $arrV)
					$arrAllValue[0][$arr] = $arrAllValue[0][$arr] + $arrV;//суммируем рейтинг для одного типа рейтинга

			$arrAllValue[1][$arr] = 0;
			$stmt = "
			SELECT `value`
			FROM `log_rates`
			WHERE `rate_type` = 1 AND
						`rate_num` = " . $arr;
			$arrValue = $objDB->selectSimpleArray($stmt);//получаем деньги для одного типа рейтинга

			if (isset($arrValue))
				foreach ($arrValue as $arrV)
					$arrAllValue[1][$arr] = $arrAllValue[1][$arr] + $arrV;//суммируем деньги для одного типа рейтинга
		}
		$sumRating = 0;
		$sumMoney = 0;
		foreach ($arrAllValue[0] as $arr)//получаем общее количество рейтинга
			$sumRating = $sumRating + $arr;

		foreach ($arrAllValue[1] as $arr)//получаем общее количество денег
			$sumMoney = $sumMoney + $arr;

		foreach ($arrAllValue[0] as $a=>$b){
			$arrAllValue[2][$a] = round(($b/$sumRating)*100,2);
		}
		foreach ($arrAllValue[1] as $a=>$b){
			$arrAllValue[3][$a] = round(($b/$sumMoney)*100,2);
		}
		return $arrAllValue;
	}

	/**
	 * получаем топ пользователей
	 *
	 */
	public function getTopUser($pageNum){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT COUNT(`user`.`ID_user`)
		FROM `user`";
  	$this->setItemCount($objDB->selectSimpleField($stmt));

		$stmt = "
		SELECT `user`.`ID_user`,
					 `user`.`login`,
					 `user`.`pic_path`,
					 `user`.`comment_amount`,
					 `user`.`lesson_amount`,
					 `user`.`article_amount`,
					 `user`.`answer_amount`,
					 `user`.`question_amount`,
					 `user`.`solution_amount`,
					 `user`.`friends_amount`,
					 `user`.`set_mark_amount`,
					 `user`.`difficulty_mark_amount`,
					 `user`.`voting_amount`,
					 `user`.`rating_place`,
					 `user`.`hits`,
					 `user`.`rating`
		FROM `user`
		WHERE `user`.`rating_place` IS NOT NULL
		ORDER BY `user`.`rating_place` " . $this->makeLimits($pageNum);
		return $objDB->select($stmt);
	}

	/**
	 * получаем список пользователей сортиролванных по ретингу для конкретного раздела
	 *
	 */
	public function getFolderTopUser($pageNum, $arrStmtWhere, $idFolder = NULL){
		$objDB = Service_Database::instance();
    $stmtWhere = $arrStmtWhere ? ' WHERE ' . join(' AND ', $arrStmtWhere) : '';

    if ($idFolder){
			$stmt = "
			SELECT COUNT(`folder_rating`.`ID_folder_rate`) AS `count`
			FROM `folder_rating`
			LEFT JOIN `user` ON `user`.`ID_user` = `folder_rating`.`ID_user` " . $stmtWhere . "
			GROUP BY `folder_rating`.`ID_user`";
	  	$this->setItemCount(count($objDB->select($stmt)));
	
			$stmt = "
			SELECT `user`.`ID_user`,
						 `user`.`login`,
						 `user`.`pic_path`,
						 `user`.`comment_amount`,
						 `user`.`lesson_amount`,
						 `user`.`article_amount`,
						 `user`.`answer_amount`,
						 `user`.`question_amount`,
						 `user`.`solution_amount`,
						 `user`.`friends_amount`,
						 `user`.`set_mark_amount`,
						 `user`.`difficulty_mark_amount`,
						 `user`.`voting_amount`,
						 `user`.`rating_place`,
						 `user`.`hits`,
						 `folder_rating`.`recount_temp_rating`,
						 `folder_rating`.`rating`,
						 `folder`.`ID_main_root_folder`
			FROM `folder_rating`
			LEFT JOIN `user` ON `user`.`ID_user` = `folder_rating`.`ID_user`
			LEFT JOIN `folder` ON `folder`.`ID_root_folder` = " . $idFolder . $stmtWhere . "
			GROUP BY `folder_rating`.`ID_user`
			ORDER BY `folder_rating`.`recount_temp_rating` DESC, `folder_rating`.`rating` DESC" . $this->makeLimits($pageNum);
    }
    else {
    	$stmt = "
			SELECT COUNT(`user`.`ID_user`)
			FROM `user`";
	  	$this->setItemCount($objDB->selectSimpleField($stmt));
	  	
			$stmt = "
			SELECT `user`.`ID_user`,
						 `user`.`login`,
						 `user`.`pic_path`,
						 `user`.`comment_amount`,
						 `user`.`lesson_amount`,
						 `user`.`article_amount`,
						 `user`.`answer_amount`,
						 `user`.`question_amount`,
						 `user`.`solution_amount`,
						 `user`.`friends_amount`,
						 `user`.`set_mark_amount`,
						 `user`.`difficulty_mark_amount`,
						 `user`.`voting_amount`,
						 `user`.`rating_place`,
						 `user`.`hits`,
						 `user`.`rating`
			FROM `user`
			ORDER BY `user`.`rating` DESC " . $this->makeLimits($pageNum);
    	
    }
    //echo $stmt;
    /*echo '<pre>';
    print_r($objDB->select($stmt));
    echo '</pre>';*/
    return $objDB->select($stmt);
	}

  /**
   * возвращает место пользователя по папке и ретингу
   */
  public static function getUserPlaceByRating($rating, $idFolder){
    $objDB = Service_Database::instance();
    if ($idFolder){
	    $stmt = "
	     SELECT COUNT(`folder_rating`.`ID_user`)
	     FROM `folder_rating`
	     WHERE `folder_rating`.`" . View_Rating::checkIdFolder($idFolder) . "` > " . ($rating  + 0.001) . ($idFolder ? " AND `folder_rating`.`ID_folder` = " . $idFolder : '');
    }
    else {
	    $stmt = "
	     SELECT COUNT(`user`.`ID_user`)
	     FROM `user`
	     WHERE `user`.`" . View_Rating::checkIdFolder($idFolder) . "` > " . ($rating + 0.001);    	
    }
    //echo $stmt . '<br />' . $objDB->selectSimpleField($stmt);
    return ($objDB->selectSimpleField($stmt) + 1);
  }

	/**
	 * получаем рейтинг конкретного пользователя по логину
	 */
	public static function getUserRatingPlace($login){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `user`.`rating_place`
		FROM `user`
		WHERE `user`.`login` = '" . $login . "'";
		return $objDB->selectOne($stmt);
	}

	/**
	 * записываем рейтинг конкретной папки
	 */
	public static function updateFolderRating($idUser, $idFolder, $rating){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT COUNT(`folder_rating`.`ID_folder_rate`)
		FROM `folder_rating`
		WHERE `folder_rating`.`ID_user` = " . $idUser . " AND `folder_rating`.`ID_folder` = " . $idFolder;
		$issetFolder = $objDB->selectSimpleField($stmt);

		if ($issetFolder){
			$stmt = "
			UPDATE `folder_rating` SET `folder_rating`.`recount_temp_rating` = " . $rating . "
			WHERE `folder_rating`.`ID_user` = " . $idUser . " AND `folder_rating`.`ID_folder` = " . $idFolder;
			return $objDB->query($stmt);
		}
		else {
			$stmt = "
			INSERT INTO `folder_rating` (`ID_folder`, `ID_user`, `recount_temp_rating`)
			VALUES (" . $idFolder . ", " . $idUser . ", " . $rating . ")";
			return $objDB->query($stmt);
		}
	}

	/**
	 * пересчет мест пользователей
	 *
	 */
	public function alternatePlaceRecount(){
		$objDB = Service_Database::instance();

		//получаем все папкм
		$stmt = "
		SELECT `folder`.`ID_folder`, `folder`.`ID_root_folder`
		FROM `folder`";
		$this->arrFolders = $objDB->select($stmt);

		$arrTreeFolders = Service_ArrayConverter::convertToTreeArray($this->arrFolders, 'ID_folder', 'ID_root_folder');

		foreach ($this->arrFolders as $a) {
			$arrTreeFoldersKey[$a['ID_folder']] = $a;
		}
		$this->arrFolders = $arrTreeFoldersKey;

		$this->getRootFoldersWithChilderns($arrTreeFolders);

		$stmt = "
		SELECT `folder_rating`.`ID_user`, `ID_folder`, `rating`
		FROM `folder_rating`";
		$arrRating = $objDB->select($stmt);

		//сортируем по Id_user
		foreach ($arrRating as $a) {
			$arrRatingUserSort[$a['ID_user']][$a['ID_folder']] = $a;
		}

		//прибавляем к рутовым папкам ретинг потомков
    foreach ($arrRatingUserSort as $idUser=>$userFolders){
    	foreach ($this->arrRootFolders as $idRootFolder=>$childrens){
    		$idRoot = $idRootFolder;
    		foreach ($childrens as $idFolder){
    			if (isset($arrRatingUserSort[$idUser][$idFolder])){
    				if (!isset($arrRatingUserSortByRootFolders[$idRootFolder][$idUser]))
    					$arrRatingUserSortByRootFolders[$idRootFolder][$idUser] = 0;
    				$arrRatingUserSortByRootFolders[$idRootFolder][$idUser] += $arrRatingUserSort[$idUser][$idFolder]['rating'];
    			}
    		}
    	}
    }

    foreach ($arrRatingUserSortByRootFolders as $a=>$b){
    	foreach ($b as $c=>$d)
    		$arrRatingUserSortByRootFoldersSort[$a][] = array('ID_user'=>$c, 'rating'=>$d);

    	usort($arrRatingUserSortByRootFoldersSort[$a], "Rating::userRatingSort");
    	foreach ($arrRatingUserSortByRootFoldersSort[$a] as $num=>$arr)
    		$values[] = ' (' . $a . ', ' . $arr['ID_user'] . ', ' . $arr['rating'] . ', ' . ($num + 1) . ')';
    }

    /*echo '<pre>';
    	print_r($arrRatingUserSortByRootFoldersSort);
    echo '</pre>';*/

    $stmt = "
    DELETE
    FROM `folder_rating`
    WHERE `folder_rating`.`ID_folder` IN (" . join(', ', $this->arrFoldersIds) . ")";
    $objDB->query($stmt);

    $stmt = "
			INSERT INTO `folder_rating` (`ID_folder`, `ID_user`, `recount_temp_rating`, `place`)
			VALUES " . join(',', $values);
    //echo $stmt;
    $objDB->query($stmt);
	}

	/**
	 * создаем массив типа array('id_рутового_раздела'=>array([]=>'id_раздела', ...))
	 */
	public function getRootFoldersWithChilderns($arrTreeFolders, $idRoot = NULL){
		foreach ($arrTreeFolders as $a){
			if ($a['ID_root_folder'] == NULL){
				$this->arrRootFolders[$a['ID_folder']] = array();
				$this->arrRootFolders[$a['ID_folder']][] = $a['ID_folder'];
				$this->arrFoldersIds[] = $a['ID_folder'];

				if (isset($a['children']))
					$this->getRootFoldersWithChilderns($a['children'], $a['ID_folder']);
			}
			else {
				$this->arrRootFolders[$idRoot][] = $a['ID_folder'];
				if (isset($a['children']))
					$this->getRootFoldersWithChilderns($a['children'], $idRoot);
			}
		}
	}

	static function userRatingSort($a, $b){
		if($a['rating']==$b['rating']) return 0;
	  return ($a['rating'] > $b['rating']) ? -1 : 1;
	}

	public static function getSortUserRating($idUser){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `log_rates`.`rate_type`,
					 `log_rates`.`rate_num`,
					 `log_rates`.`value`
		FROM `log_rates`
		WHERE `log_rates`.`ID_user` = " . $idUser . " AND `value` NOT IN (0)";
		$arrLog = $objDB->select($stmt);

		if ($arrLog){
			foreach ($arrLog as $arrLog){
				if (!isset($arrLogSort[$arrLog['rate_type']][$arrLog['rate_num']]))
					$arrLogSort[$arrLog['rate_type']][$arrLog['rate_num']] = 0;
				$arrLogSort[$arrLog['rate_type']][$arrLog['rate_num']] += $arrLog['value'];
			}
			return $arrLogSort;
		}
		else
			return NULL;
	}

	/**
	 * получаем "правильный" топ список пользоватлей
	 */
	public function getFolderUserTop($pageNum, $idFolder){
		$arrGeneralInformation = $this->_getFolderUserTopOnlyGeneral($pageNum, $idFolder);

		foreach ($arrGeneralInformation as $arrUser)
			$arrUserIds[] = $arrUser['ID_user'];
		$strUserIds = join(', ', $arrUserIds);

		$arrArticles = self::_getFolderUserTopCountUserArticles($strUserIds, $idFolder);
		echo '<pre>';
			print_r($arrArticles);
		echo '</pre>';
		$arrquestions = self::_getFolderUserTopCountUserquestion($strUserIds, $idFolder);
		echo '<pre>';
			print_r($arrquestions);
		echo '</pre>';
	}

	/**
	 * получаем ретинг пользователей
	 */
	public function _getFolderUserTopOnlyGeneral($pageNum, $idFolder){
		$objDB = Service_Database::instance();
		$stmtWhere = ' WHERE `folder_rating`.`ID_folder` = ' . $idFolder;
		$stmt = "
		SELECT COUNT(`folder_rating`.`ID_folder_rate`) AS `count`
		FROM `folder_rating`" . $stmtWhere . "
		GROUP BY `folder_rating`.`ID_user`";
  	$this->setItemCount(count($objDB->select($stmt)));

		$stmt = "
		SELECT `user`.`ID_user`,
					 `user`.`login`,
					 `user`.`pic_path`,
					 `user`.`hits`,
					 `folder_rating`.`rating`,
					 `folder_rating`.`recount_temp_rating`
		FROM `folder_rating`
		LEFT JOIN `user` ON `user`.`ID_user` = `folder_rating`.`ID_user`" . $stmtWhere . "
		GROUP BY `folder_rating`.`ID_user`
		ORDER BY `folder_rating`.`recount_temp_rating` DESC, `folder_rating`.`rating` DESC" . $this->makeLimits($pageNum);
		return $objDB->select($stmt);
	}

	/**
	 * получаем количество комментариев пользователя в разделе
	 */
	public static function _getFolderUserTopCountUserquestion($strUserIds, $idFolder){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `question`.`ID_user`, COUNT(*)
		FROM `question`
		WHERE `question`.`ID_folder` = " . $idFolder . " AND
					`question`.`ID_user` IN (" . $strUserIds . ")
		GROUP BY `question`.`ID_user`";
		return $objDB->select($stmt);
	}

	/**
	 * получаем количество статей пользователя в разделе
	 */
	public static function _getFolderUserTopCountUserArticles($strUserIds, $idFolder){
		$objDB = Service_Database::instance();
		$stmt = "
		SELECT `article`.`ID_user`, COUNT(*)
		FROM `article`
		WHERE `article`.`essence_type` = 11 AND
					`article`.`draft` = 0 AND
					`article`.`ID_essence` = " . $idFolder . " AND
					`article`.`ID_user` IN (" . $strUserIds . ")
		GROUP BY `article`.`ID_user`";
		return $objDB->select($stmt);
	}
}
?>